package com.example.interceptor;

import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Connection;
import java.util.Properties;

/**
 * @Author victor
 * @Date 2020/10/20 10:49
 * @description：
 */
@Intercepts({ //注意看这个大花括号，也就这说这里可以定义多个@Signature对多个地方拦截，都用这个拦截器
        @Signature(
                type = StatementHandler.class,  //这是指拦截哪个接口
                method = "prepare",  //这个接口内的哪个方法名，不要拼错了
                args = {Connection.class, Integer.class}),  // 这是拦截的方法的入参，按顺序写到这，不要多也不要少，如果方法重载，可是要通过方法名和入参来确定唯一的
})
public class MyPlugin implements Interceptor {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());  //这里是每次执行操作的时候，都会进行这个拦截器的方法内

    //此方法时拦截后要执行的方法
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("此方法被拦截了" + invocation.getClass());
        return invocation.proceed();//执行原方法
    }

    /**
     * 主要是为了把这个拦截器生成一个代理放到拦截器链中
     * Description包装目标对象 为目标对象创建代理对象
     *
     * @Param target为要拦截的对象
     * @Return代理对象
     */
    @Override
    public Object plugin(Object target) {
        Object wrap = Plugin.wrap(target, this);
        System.out.println("此方法拦截了" + wrap.getClass());
        return wrap;
    }

    @Override
    public void setProperties(Properties properties) {
        //读取配置文件中传过来的属性
        System.out.println("插件配置的初始化参数：" + properties);
    }
}

